package com.gjp.controller;

import com.google.common.io.Files;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;

/**
 * Created by 郭金鹏 on 2018/7/3.
 */
@RestController
public class DataController {

    private JsonObject data = null;

    /**
     * 根据用户传入参数，动态获取data.json中对应的数据，不存在则返回空字符串
     *
     * @param itemName 读取的json内容参数名
     * @return
     */
    @GetMapping("/api/{itemName}")
    public String getData(@PathVariable("itemName") String itemName) {
        //每次请求都读取数据，虽然很复杂，但是可以动态改变内容
        initData();
        JsonElement item = data.get(itemName);
        if (item != null) {
            if (item.isJsonArray()) {
                return item.getAsJsonArray().toString();
            } else if (item.isJsonObject()) {
                return item.getAsJsonObject().toString();
            }
        }
        return "";
    }

    //初始化数据
    private void initData() {
        try {
            //当前项目根目录
            File rootDir = new File("");
            //获取项目相同目录下的data.json
            File dataJsonPath = new File(rootDir.getCanonicalPath() + "/data.json");
            //如果这个文件不存在，则读取项目内部的默认data.json
            if (!dataJsonPath.exists()) {
                dataJsonPath = new ClassPathResource("data.json").getFile();
            }
            //读取json文件所有数据
            ArrayList<String> lines = (ArrayList<String>) Files.readLines(dataJsonPath, Charset.forName("utf-8"));
            //将集合转换为数组，并用空字符串连接
            String dataJsonStr = String.join("", lines.toArray(new String[]{}));
            //将json字符串转换为jsonObject
            data = new Gson().fromJson(dataJsonStr, JsonObject.class);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
